#!/bin/bash
#set -x
BASE_DIR=`cd $(dirname $0);pwd`

#这是创建kubectl使用ServiceAccount Token连接kubernetes APIServer的脚本
#测试版本 Kubernetes v1.25
#1. 确定kubernetes集群的CA证书路径,修改CA_PATH
#2. 确定要连接的kubernetes集群的访问地址,修改CLUSTER_ACCESS_ADDRESS
#3. 修改CLUSTER_NAME,这个name就是给kubeconfig文件中cluster配置起一个名字
#4. 脚本默认会在users命名空间创建ServiceAccount,命名空间不存在会自动创建
CA_PATH=/etc/kubernetes/pki/ca.crt
CLUSTER_ACCESS_ADDRESS="192.168.5.39:6443"
CLUSTER_NAME=dev
SA_NS=users

fouction_create_SA(){
	read -p "请输入要创建的ServiceAccount名称:" SA

	FILES_DIR=${BASE_DIR}/ServiceAccount/${SA}
	mkdir -p ${FILES_DIR}

	#创建命名空间和ServiceAccount
	kubectl get ns ${SA_NS} &>/dev/null && echo "命名空间已经存在,无需重复创建" || kubectl create ns ${SA_NS}
	kubectl create sa ${SA} -n ${SA_NS}

#创建Secret,然后kubernete通过sannotations注解关联ServiceAccount,把Token注入到Secret当中
cat > ${FILES_DIR}/${SA}-secret.yaml <<EOF
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: ${SA}
  namespace: ${SA_NS}
  annotations:
    kubernetes.io/service-account.name: ${SA}
EOF
kubectl create -f ${FILES_DIR}/${SA}-secret.yaml

}

fouction_config_context(){

	TOKEN=$(kubectl get secret ${SA} -n ${SA_NS} -o jsonpath={.data.token} | base64 -d)

	#配置集群信息
        kubectl config set-cluster ${CLUSTER_NAME} \
        --certificate-authority=${CA_PATH} \
        --embed-certs \
        --server=https://${CLUSTER_ACCESS_ADDRESS} \
        --kubeconfig=${FILES_DIR}/${SA}.kubeconfig

	#创建用户
        kubectl config set-credentials ${SA} \
	--token=${TOKEN} \
        --kubeconfig=${FILES_DIR}/${SA}.kubeconfig

	#创建上下文
        kubectl config set-context ${SA}@${CLUSTER_NAME} \
        --cluster=${CLUSTER_NAME} \
        --user=${SA} \
        --kubeconfig=${FILES_DIR}/${SA}.kubeconfig

	
        #设置当前使用的上下文
        kubectl config use-context ${SA}@${CLUSTER_NAME} \
        --kubeconfig=${FILES_DIR}/${SA}.kubeconfig

        echo "------>配置集群连接:
        如果已经配置了集群连接,查看是否有KUBECONFIG变量,如果有,找出定义该变量的配置文件,一般为/etc/profile或者${HOME}/.bashrc
        把新生成的连接kubernetes集群的配置文件路径配置到定义KUBECONFIG变量的文件中,例如:
        export KUBECONFIG=\${KUBECONFIG}:新配置文件路径
        source ${HOME}/.bashrc 或者 source /etc/profile

        如果发现没有KUBECONFIG变量,那就是使用了一个$HOME/.kube/config配置文件,把该配置文件和新配置文件一起配置到定义KUBECONFIG变量的文件中,例如:
        export KUBECONFIG=\${HOME}/.kube/config:新配置文件路径
        source ${HOME}/.bashrc 或者 source /etc/profile

        如果只是临时使用,可以使用kubectl --kubeconfig=config-demo 指定连接集群的用户配置文件,例如:
        kubectl --kubeconfig=config-demo view
        "
}

fouction_create_SA
fouction_config_context
#kubectl delete sa ${SA} -n ${SA_NS}
